cbb3874749120b123a22337b6c1fec828d4366e2,Manager/src/main/java/com/rainbow/kam/ble_gatt_manager/manager/GattManager.java,GattManager,observeIndication,#BluetoothGattCharacteristic#,316

Before Change



    @Override public Observable<GattObserveData> observeIndication(
            final BluetoothGattCharacteristic characteristicToIndication) {
        return Observable.merge(indicationSubject = PublishSubject.create(),
                Observable.create((Observable.OnSubscribe<GattObserveData>) subscriber -> {
                    if (isConnected()) {
                        if (characteristicToIndication != null) {
                            bluetoothGatt.setCharacteristicNotification(characteristicToIndication, true);
                            BluetoothGattDescriptor indicationDescriptor = characteristicToIndication.getDescriptor(BluetoothGatts.CLIENT_CHARACTERISTIC_CONFIG);
                            indicationDescriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
                            bluetoothGatt.writeDescriptor(indicationDescriptor);
                        } else {
                            subscriber.onError(UUID_NOT_FOUND);
                        }
                    } else {
                        subscriber.onError(GATT_NOT_CONNECTED);
                    }
                })).doOnSubscribe(() -> currentIndicationCharacteristic = characteristicToIndication);
    }

After Change



    @Override public Observable<BluetoothGattCharacteristic> observeIndication(
            final BluetoothGattCharacteristic characteristicToIndication) {
        return Observable.create((Observable.OnSubscribe<BluetoothGattCharacteristic>) subscriber -> {
            GattException exception = checkGattStatusSuccess(characteristicToIndication);
            if (exception != null) {
                subscriber.onError(exception);
                return;
            }
            gattManagerCallBack.setIndicateListener(new GattIndicateCharacteristicOnSubscribe() {
                @Override
                public void onCharacteristicIndicatePrepared(BluetoothGattCharacteristic characteristic) {
                    if (isCharacteristicAvailable(characteristic, currentIndicationCharacteristic)) {
                        subscriber.onStart();
                    }
                }


                @Override
                public void onCharacteristicIndicateSucceeded(BluetoothGattCharacteristic characteristic) {
                    if (isCharacteristicAvailable(characteristic, currentIndicationCharacteristic)) {
                        subscriber.onNext(characteristic);
                    }
                }


                @Override
                public void onCharacteristicIndicateFailed(BluetoothGattDescriptor descriptor, int status) {
                    if (isCharacteristicAvailable(descriptor.getCharacteristic(), currentIndicationCharacteristic)) {
                        subscriber.onError(new GattNotificationCharacteristicException(descriptor, DESCRIPTION_WRITE_FAIL, status));
                    }
                }
            });
            bluetoothGatt.setCharacteristicNotification(characteristicToIndication, true);
            BluetoothGattDescriptor indicationDescriptor = characteristicToIndication.getDescriptor(BluetoothGatts.CLIENT_CHARACTERISTIC_CONFIG);
            indicationDescriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
            bluetoothGatt.writeDescriptor(indicationDescriptor);
        }).doOnSubscribe(() -> currentIndicationCharacteristic = characteristicToIndication)
                .doOnUnsubscribe(() -> gattManagerCallBack.setIndicateListener(null));
    }